"""
分析器基类模块
"""
import pandas as pd
from abc import ABC, abstractmethod
import matplotlib.pyplot as plt
from loguru import logger


class Analyzer(ABC):
    """
    分析器基类，定义了分析回测结果的接口
    
    Parameters
    ----------
    trades : pandas.DataFrame
        交易记录DataFrame，包含以下列：
        - datetime: 交易时间
        - symbol: 交易品种
        - direction: 交易方向（1为多，-1为空）
        - price: 成交价格
        - volume: 成交数量
        - commission: 手续费
        - pnl: 该笔交易的盈亏
        
    equity_curve : pandas.DataFrame
        资金曲线DataFrame，包含以下列：
        - datetime: 时间
        - equity: 账户总权益
        - cash: 可用资金
        - position_value: 持仓市值
        - returns: 收益率
    """
    
    def __init__(self, trades, equity_curve):
        """
        初始化分析器
        
        Parameters
        ----------
        trades : pandas.DataFrame
            交易记录
        equity_curve : pandas.DataFrame
            资金曲线
        """
        # 检查交易记录数据
        required_trade_columns = ['datetime', 'symbol', 'direction', 'offset', 'price', 'volume']
        missing_trade_columns = [col for col in required_trade_columns if col not in trades.columns]
        if missing_trade_columns:
            logger.error(f"交易记录缺少必需列: {missing_trade_columns}")
            raise ValueError(f"交易记录必须包含以下列: {required_trade_columns}")
            
        # 检查资金曲线数据
        required_equity_columns = ['datetime', 'equity']
        missing_equity_columns = [col for col in required_equity_columns if col not in equity_curve.columns]
        if missing_equity_columns:
            logger.error(f"资金曲线缺少必需列: {missing_equity_columns}")
            raise ValueError(f"资金曲线必须包含以下列: {required_equity_columns}")
            
        # 确保时间列是datetime类型
        if not isinstance(trades['datetime'].dtype, pd.DatetimeDtype):
            trades['datetime'] = pd.to_datetime(trades['datetime'])
        if not isinstance(equity_curve['datetime'].dtype, pd.DatetimeDtype):
            equity_curve['datetime'] = pd.to_datetime(equity_curve['datetime'])
            
        # 存储数据
        self._trades = trades
        self._equity_curve = equity_curve
        
        # 存储分析结果
        self._results = None
    
    @property
    def results(self):
        """获取分析结果，如果还未分析则返回None"""
        return self._results
    
    @abstractmethod
    def analyze(self):
        """
        分析回测结果，必须由子类实现
        
        Returns
        -------
        dict
            分析结果字典，包含各项分析指标
        """
        pass
